\section{Requisiti del cliente}
Sviluppare un sistema di negozio virtuale di libri. \\
I requisiti minimi del sistema sono i seguenti:
\begin{enumerate}
 \item Il sistema deve saper memorizzare in memoria secondaria informazioni sui libri in vendita (e.g., titolo, autore, ISBN, editore, anno)
 \item il sistema deve essere in grado di effettuare un insieme di operazioni sui dati persistenti (a tal proposito le operazioni minime richieste sono ricerca per autore, ricerca per titolo, selezione dei libri da acquistare e acquisto definitivo dei libri selezionati)
 \item il sistema deve fornire un'interfaccia per l'utilizzo da parte di client finali. L'interfaccia puo essere fornita tramite componenti Web oppure componenti Java grafiche. Solo quando i client vogliono selezionare libri a cui sono interessati accedono al sistema tramite login e password. La selezione consiste nel mettere temporaneamente il libro in un carrello. Ad ogni istante l'utente puo acquistare definitivamente i libri nel suo carrello.
\end{enumerate}

\subsection{Ambiente di sviluppo richiesto dal cliente}
Il sistema descritto sopra dovr\`a essere implementato utilizzando l'application server J2EE JBoss (ultima versione disponibile); si consiglia come ambiente di sviluppo Eclipse (ultime versioni) ma altri IDE disponibili possono essere utilizzati. \\
Si devono utilizzare EJB 3.0 e si potr\`a utilizzare il database di default (Hypersonic). L'interfaccia grafica o Web acceder\`a mediante Web Services al servizio di negozio virtuale di libri. Infine, l'applicazione deve essere schierata in maniera omogenea in un cluster di nodi JBoss.


\section{Requisiti funzionali}
%Detailed description of the services offered by the system
\subsection{Requisiti minimi}
\begin{itemize}
\item Per ogni libro devono essere memorizzate le seguenti informazioni minime: titolo, autore, isbn, editore, anno. 
\item Un cliente deve poter eseguire ricerche per autore e per titolo dei libri in vendita.
\item Un cliente deve poter selezionare dei libri da acquistare tra quelli in vendita. I libri selezionati devono essere messi temporaneamente in un carrello associato al cliente stesso.
\item Un cliente deve poter acquistare i libri che ha messo nel suo carrello in ogni momento.
\item Il sistema deve fornire anche l'interfaccia per l'utilizzo da parte degli utenti.
\item Un cliente puo' autenticarsi nel sistema tramite password e username.
\item Per poter selezionare un libro da acquistare il cliente si deve autenticare nel sistema.
\end{itemize}

\subsection{Requisiti aggiunti}
\begin{itemize}
\item L'aggiunta di un libro in un carrello da parte di un cliente equivale ad una prenotazione di quella copia (o quelle copie). Solo se il libro viene rimosso da carrello l'articolo ritorner\`a disponibile agli altri clienti.
\item Quando un cliente esegue il logout, tutti i libri presenti nel suo carrello devono ritornare disponibili agli altri clienti.
\item Un cliente deve poter registrarsi nel sistema inserendo obbligatoriamente nome, congnome, mail e password; altre informazioni legate al recapito sono opzionali.
\item Non possono esistere nel sitema due clienti registrati con la stessa e mail.
\item Il negozio fornisce una vetrina, in cui vengono visualizzati solo alcuni libri in vendita.
\item L'amministratore, all'aggiunta di un libro al catalogo del negozio, deve essere in grado di decidere se inserire il libro in vetrina oppure no.
\item Un cliente non pu\`o portare a termine un acquisto di un carrelo vuoto.
\item Un cliente deve poter inserire nel carrello pi\`u di una copia di uno stesso libro
\item Un cliente, se non ha gi\`a confermato l'ordine, deve poter modificare in qualsiasi momento il proprio carrello.
\item Un cliente pu\`o avere pi\`u ordini in sospeso, che attendono di essere pagati.
\item Quando il cliente conferma l'ordine, il sistema deve comunicare al sistema di pagamento l'identificativo dell'ordine stesso.
\item un cliente che ha effettuato una ricerca sul catalogo, deve poter modificare l'ordine dei libri impostando il criterio di ordinamento (crescente o decrescente) di uno dei campi dei libri.
\item Un cliente deve poter visualizzare i resoconti dei propri ordini.
\item Non \`e possibile che un cliente aggiunga al carrello un libro non disponibile.
\item Un cliente pu\`o aggiungere al carrello sia libri ottenuti dalla ricerca che libri provenienti dalla vetrina
\end{itemize}



\section{Requisiti non funzionali}
% Constraints on product and process
\subsection{Requisiti minimi}
\begin{itemize}
\item Le informazioni sui libri in vendita devono essere memorizzate in memoria secondaria.
\item L'interfaccia utilizzabile dall'utente deve essere fornita tramite componenti Weboppure tramite componenti Java grafiche.
\item Il sistema deve essere implementato utilizzando l'application server J2EE JBoss e EJB3.0..
\item L'interfaccia utilizzata dagli utenti deve accedere al negozio online di libri tramite Web Services.
\item L'applicazione deve essere schierata in maniera omogenea in un cluster di nodi JBoss.
\end{itemize}


\subsection{Requisiti aggiunti}
\begin{itemize}
\item Se un cliente che si \`e autenticato nel sistema non esegue alcuna operazione per mezz'ora, deve essere effettuato un logout forzato del cliente stesso.
\item Una volta che un cliente ha confermato l'ordine, ha 2 giorni di tempo per effettuare il pagamento, altrimenti l'ordine deve essere annullato e i libri che ha tentato di acquistare devono ritornare disponibili.
\end{itemize}

\section{Sviluppi futuri}
%  Critical assumptions and likely future changes
\begin{itemize}
 \item In caso di errore nel pagamento di un ordine, al cliente deve essere inviata una mail spiegando il problema.
 \item Un cliente deve poter modificare le proprie informazioni nel profilo.
\end{itemize}



\section{Glossario}
Il glossario contiene i termini utilizzati durante il progetto. \\
Scrivere le definizioni di termini e acronimi permette di avere documentazione precisa e concisa.

\subsection{Termini del dominio}

\paragraph{Accesso autenticato} Durante l'accesso ad alcuni servizi messi a disposizione dal Web \`e importante per l'utente definire in modo univoco la propria identit\`a. Questo nel nostro caso avviene mediante l'utilizzo di nome utente e password.

\paragraph{Carrello virtuale} Il carrello virtuale permette di tenere sotto controllo gli articoli che si desidera comperare esattamente come nella realt\`a. Le informazioni importanti riguardano gli oggetti da comprare, il loro prezzo e quantit\`a, il prezzo totale.

\paragraph{Checkout} Acquisto effettivo dei libri. Implica il controllo da parte del cliente del contenturo del carrello e la decisione di procedere al pagamento del proprio ordine.

\paragraph{Cliente} Persona interessata all'acquisto dei libri.

\paragraph{Libro} Ogni libro porta con se informazioni quali ISBN, titolo, autore, casa editrice, prezzo, parole chiave, copie disponibili per la vendita, e presenza del testo nella vetrina.

\paragraph{Negozio virtuale} Negozio che permette la vendita solo ed esclusivamente sul web.

\paragraph{Utente} Esistono due tipologie di utenti del sitema, le persone interessate all'acquisto dei libri (Clienti) e gli amministratori del sistema

\subsection{Termini specifici del progetto}

\paragraph{Bean} Dette anche Session Bean, posso essere Stateful o Stateless (con o senza stato). Una Session Bean \`e come una normale classe Java, a parte il fatto che:
\begin{enumerate}
 \item deve avere l'annotazione \textit{@Stateful} o \textit{@Stateless} prima del nome della classe
 \item pu\`o fare riferimento all'Entity Manager del container, specificando un campo e anteponendovi l'annotazione \textit{@PersistenceContext}
 \item pu\`o fare riferimento ad altre Session Bean, specificando un campo e anteponendovi l'annotazione \textit{@EJB}
 \item non pu\`o fare riferimento a Servlet
 \item deve dichiarare o un'Interfaccia Remota o un'Interfaccia Locale. Pu\`o dichiararle entrambe.
 \item pu\`o dichiarare un'interfaccia Web Service
\end{enumerate}

\paragraph{Entit\`a} Rappresentano classi di oggetti (fatti, cose, persone,...) che hanno propriet\`a comuni ed esistenza autonoma ai fini dell'applicazione di interesse. Un'occorrenza di un'entit\`a \`e un oggetto della classe che l'entit\`a rappresenta.

\paragraph{Entity Bean} Solo la rappresentazione del concetto di Entit\`a in EJB3. Come da definizione di entit\`a, rappresentano classi di oggetti. Rappresentano i record della tabella del database. In EJB3 non esiste un modo di rappresentare le tabelle del database, si rappresentano solo i record. Collezioni di entity bean vengono restituite ad ogni ricerca.

\paragraph{Interfaccia Locale} \`E del tutto simile ad una interfaccia di Java, ma prima del suo nome va posta l'annotazione \textit{@Local}. Tutti i metodi esposti tramite interfaccia Remota sono accessibili in locale (all'interno del container stesso). Sono spesso usate per rendere pi\`u performante lo scambio dati quando non si esce dal container.

\paragraph{Interfaccia Remota} \`E del tutto simile ad una interfaccia di Java, ma prima del suo nome va posta l'annotazione \textit{@Remote}. Tutti i metodi esposti tramite interfaccia Remota sono accessibili in remoto.

\paragraph{Interfaccia Web Service} \`E del tutto simile ad una interfaccia di Java, ma:
\begin{enumerate}
 \item prima del suo nome va posta l'annotazione \textit{@WebService}
 \item  prima del nome di ogni suo metodo va posta l'annotazione \textit{@WebMethod}
 \item  nel nome della classe che la implementa va posta l'annotazione \textit{@WebService}
\end{enumerate}
 Per ogni Web Service viene creato un file WSDL autogeneto dal container. Per accedere ad un Web Service si utilizzano proxy client, generalmente utilizzati nei client o nelle Servlet

\paragraph{JSP (Java Server Pages)} Sono pagine web con codice particolare intercalato nel markup. Sono simili alle pagine PHP come funzionamento, ma con qualche differenza. Il client vede solo arrivare codice HTML formattato, non conosce niente della servlet. Dato un file JSP, il container genera una Servlet che sar\`a eseguita.

\paragraph{Session Bean} Sinonimo di Bean

\paragraph{Servlet} Pagine web processate a lato server. Una servlet pu\`o:
\begin{enumerate}
 \item Interagire con l'Interfaccia Remota di una Bean
 \item Interagire con l'Interfaccia Locale di una Bean
 \item Interagire con un'Interfaccia Web Service
\end{enumerate}
